package com.pay.task.job;

import cn.hutool.core.util.ZipUtil;
import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import com.pay.common.resp.Response;
import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.client.RestTemplate;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 微信对账任务，微信在次日9点启动生成前一天的对账单，建议商户10点后再获取；
 */
@Component
public class WechatReconJob {

    @Autowired
//    @Lo
    private RestTemplate restTemplate;


    @XxlJob("wechatReconJob")  //xxl_job 后台中配置任务
    public void process(){

        //1.调用微信接口下载对账文件
        Response response =  restTemplate.getForObject("前置服务器地址", Response.class);

        String filePath = "/local/20210621/fund_bill_20210621.zip";

        //2.解析excel. poi easyExacel

         //2.1 解压到当前目录
        ZipUtil.unzip(filePath);

        //2.2 解析对账文件 ,根据对账文件的格式 使用不同的技术去解析，银行csv，微信是xls

        //定义一个以逗号为分隔符、读取时忽略引号的CSVReader就是：

        try {
            CSVReader reader = new CSVReader(
                    new InputStreamReader(new FileInputStream("/local/20210621/fund_bill_20210621/xxxx.cvs"), "GBK"),
                    CSVWriter.DEFAULT_SEPARATOR,
                    CSVWriter.NO_QUOTE_CHARACTER);

            //一个字段读

            List<String[]>  list = reader.readAll();
            for (String[] s: list){
                //读到每一行
            }

            //批量插入 for each

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


        //3. 对比对账文件的 数据和，支付流水表中的数据。
        //   交易表 和临时表的数据


        //获取对账文件表中的数据 1w

        List<Object> reonList = new ArrayList();

        //维度一：以微信的数据去匹配商户的数据
        for (int i =0; i<reonList.size();i++){

            //获取商户流水号，

             Object reconSerialInfo = reonList.get(i);
             String paySerialNo = (String)reonList.get(i);

             //去支付流水表中查询 select * from 流水表 where pay_serial_NO = paySerialNo;

            //获取数据库中的对象
            Object paySerialInfo = null;

            if(ObjectUtils.isEmpty(paySerialInfo)){

                //银行存在，我们没我有
                continue;
            }

            if (!"对账文件金额".equals("流水中金额")){

                //金额不匹配
                continue;
            }

            if (!"对账文件的状态".equals("流水状态")){

                //银行成功，我们是未知 或者失败的。
                // 记录， insert到对账差异表中
                continue;
            }

        }

        //4. 记录差异数据。 对账差役记录表


        //维度二：以商户的数据去匹配对账文件中的数据

        List  paySerialList = new ArrayList();

        for (int i =0; i<paySerialList.size();i++){

            // select * from 对账临时文件表  where  商户流水号号 = paySerialList.get("商户流水号");

        }



    }




}
